/*!
 * # 模块 Api 类:
 *  Organization - 组织管理
 * 
 * # 描述:
 *  向系统管理人员提供组织结构、部门以及岗位的管理功能，包括为组织、部门或岗位添加用户，以及设置组织、部门或岗位的权限。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Pittypat;

namespace Waln.Authority.Organization
{
	/// <summary>
	/// 提供对模块 组织管理 中功能的封装和调用。
	/// </summary>
	[global::Pittypat.Module(global::Pittypat.ModulePresentation.UI, AllowAnonymous = false)]
	public sealed class Api : global::Pittypat.Module
	{
		#region OrgsAsync

		/// <summary>
		/// 查询系统中创建的所有根组织的列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 根组织列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> OrgsAsync(
			global::Pittypat.FunctionModel<Args.Orgs> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回根组织列表
			return model.Success ? model.Args.List : null;
		}

		#endregion

		#region AddOrgAsync

		/// <summary>
		/// 添加一个根组织机构。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 新创建的根组织，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AddOrgAsync(
			global::Pittypat.FunctionModel<Args.AddOrg> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回新创建的根组织
			return model.Success ? model.Args.Org : null;
		}

		#endregion

		#region EditOrgAsync

		/// <summary>
		/// 设置指定的组织机构的信息。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 组织机构信息，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> EditOrgAsync(
			global::Pittypat.FunctionModel<Args.EditOrg> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回组织机构信息
			return model.Success ? model.Args.Org : null;
		}

		#endregion

		#region DeleteOrgAsync

		/// <summary>
		/// 删除一个指定的根组织，其中包含所有部门、岗位都会被删除，但是用户账号不会被删除。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> DeleteOrgAsync(
			global::Pittypat.FunctionModel<Args.DeleteOrg> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region DeptChildrenAsync

		/// <summary>
		/// 查询隶属于指定部门或组织的下级部门、工作岗位和用户的列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回所有输出参数的字典，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> DeptChildrenAsync(
			global::Pittypat.FunctionModel<Args.DeptChildren> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回所有输出参数的字典
			return model.Success ? model.OutArgs : null;
		}

		#endregion

		#region AddDeptAsync

		/// <summary>
		/// 为组织或一个上级部门添加一个下级部门。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 新添加的部门，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AddDeptAsync(
			global::Pittypat.FunctionModel<Args.AddDept> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回新添加的部门
			return model.Success ? model.Args.Dept : null;
		}

		#endregion

		#region EditDeptAsync

		/// <summary>
		/// 设置指定部门的资料信息。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 部门信息，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> EditDeptAsync(
			global::Pittypat.FunctionModel<Args.EditDept> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回部门信息
			return model.Success ? model.Args.Dept : null;
		}

		#endregion

		#region DeleteDeptAsync

		/// <summary>
		/// 删除一个指定的部门，隶属其中的下级部门和工作岗位都将被删除，但是用户账号不会被删除。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> DeleteDeptAsync(
			global::Pittypat.FunctionModel<Args.DeleteDept> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region AddPostAsync

		/// <summary>
		/// 为指定的组织或部门添加一个工作岗位。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 工作岗位信息，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AddPostAsync(
			global::Pittypat.FunctionModel<Args.AddPost> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回工作岗位信息
			return model.Success ? model.Args.Post : null;
		}

		#endregion

		#region EditPostAsync

		/// <summary>
		/// 设置指定工作岗位的信息。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 工作岗位信息，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> EditPostAsync(
			global::Pittypat.FunctionModel<Args.EditPost> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回工作岗位信息
			return model.Success ? model.Args.Post : null;
		}

		#endregion

		#region DeletePostAsync

		/// <summary>
		/// 删除一个工作岗位，不会删除属于该工作岗位的用户账号。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> DeletePostAsync(
			global::Pittypat.FunctionModel<Args.DeletePost> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region NewUserAsync

		/// <summary>
		/// 添加一个新的用户账号。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 新用户，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> NewUserAsync(
			global::Pittypat.FunctionModel<Args.NewUser> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回新用户
			return model.Success ? model.Args.User : null;
		}

		#endregion

		#region SearchDeptUsersAsync

		/// <summary>
		/// 按用户名、登录名、编号、手机或邮件搜索用户列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回所有输出参数的字典，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> SearchDeptUsersAsync(
			global::Pittypat.FunctionModel<Args.SearchDeptUsers> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回所有输出参数的字典
			return model.Success ? model.OutArgs : null;
		}

		#endregion

		#region AddDeptUsersAsync

		/// <summary>
		/// 为指定的部门添加一个或多个用户账号。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 用户列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AddDeptUsersAsync(
			global::Pittypat.FunctionModel<Args.AddDeptUsers> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回用户列表
			return model.Success ? model.Args.Users : null;
		}

		#endregion

		#region PostUsersAsync

		/// <summary>
		/// 查询隶属于指定工作岗位的用户的列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 用户列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> PostUsersAsync(
			global::Pittypat.FunctionModel<Args.PostUsers> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回用户列表
			return model.Success ? model.Args.List : null;
		}

		#endregion

		#region SearchPostUsersAsync

		/// <summary>
		/// 按用户名、登录名、编号、手机或邮件搜索用户列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回所有输出参数的字典，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> SearchPostUsersAsync(
			global::Pittypat.FunctionModel<Args.SearchPostUsers> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回所有输出参数的字典
			return model.Success ? model.OutArgs : null;
		}

		#endregion

		#region AddPostUsersAsync

		/// <summary>
		/// 为指定的岗位添加一个或多个用户。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 用户列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AddPostUsersAsync(
			global::Pittypat.FunctionModel<Args.AddPostUsers> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回用户列表
			return model.Success ? model.Args.Users : null;
		}

		#endregion

		#region EditUserAsync

		/// <summary>
		/// 设置指定岗位或部门中的一个用户的备注描述信息。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 用户信息，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> EditUserAsync(
			global::Pittypat.FunctionModel<Args.EditUser> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回用户信息
			return model.Success ? model.Args.Info : null;
		}

		#endregion

		#region RemoveUserAsync

		/// <summary>
		/// 移除指定岗位或部门中的一个用户。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> RemoveUserAsync(
			global::Pittypat.FunctionModel<Args.RemoveUser> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region AppsAsync

		/// <summary>
		/// 查询已经安装的所有 App 的列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 App 列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AppsAsync(
			global::Pittypat.FunctionModel<Args.Apps> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回App 列表
			return model.Success ? model.Args.List : null;
		}

		#endregion

		#region ModulesAsync

		/// <summary>
		/// 查询隶属于指定 App 的模块的列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 模块列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> ModulesAsync(
			global::Pittypat.FunctionModel<Args.Modules> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回模块列表
			return model.Success ? model.Args.List : null;
		}

		#endregion

		#region GrantAsync

		/// <summary>
		/// 为指定的部门、岗位或用户添加一个权限。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> GrantAsync(
			global::Pittypat.FunctionModel<Args.Grant> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region RevokeAsync

		/// <summary>
		/// 删除一个权限。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> RevokeAsync(
			global::Pittypat.FunctionModel<Args.Revoke> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion
	}
}
